#include<iostream>
#include<string>
using namespace std;
int m, n;
const int N = 110;
bool st[N][N];
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
int ret = 0;
void dfs(int i,int j)
{
	//递归出口
	if (i <= 0 || i >= m || j <= 0 || j >= n)
	{
		ret++;
		return;
	}
	st[i][j] = true;
	for (int k = 0;k < 4;k++)
	{
		int x = i + dx[k];int y = j + dy[k];
		if(st[x][y]==false) dfs(x, y);
	}
	st[i][j] = false;
}


int main()
{
	//左，上两个边非角点进行dfs记录方案数
	cin >> m >> n;
	for (int i = 1;i < n;i++)
	{
		st[0][i] = true;
		dfs(1, i);//不能从0开始因为0 i这个位置没办法在四周走
		st[0][i] = false;
	}
	for (int i = 1;i < m;i++)
	{
		st[i][0] = true;
		dfs(i, 1);
		st[i][0] = false;
	}
	cout << ret<< endl;
	//注意这个ret不用除2，虽然说左边到上边重复了，但是右边到下边缺少，重复的一部分正好把缺少的补上了
	return 0;
}